package com.lw.pool;

import java.util.concurrent.*;

/**
 * @author LW
 * @2020/8/20 23:02
 */

/**最大线程到底该如何定义
 *1.CPU 密集型    几核，就是几   可以保持CPU的效率最高
 *2.IO 密集型     大于（两倍）  判断程序中十分耗IO的线程
 */
public class Demo2 {

    public static void main(String[] args) {
        //获取cpu的核数
        System.out.println(Runtime.getRuntime().availableProcessors());

        //自定义线程池   ********线程池的 *********七 大 参 数
        ExecutorService threadPool = new ThreadPoolExecutor(2, 10,
                2L, TimeUnit.SECONDS,
                new LinkedBlockingQueue<Runnable>(3),//容量（等待区）  超出三个就
                Executors.defaultThreadFactory(),//默认线程工厂
                new ThreadPoolExecutor.DiscardOldestPolicy());// 拒绝策略
        /**
         * RejectedExecutionHandler  四大拒绝策略
         * AbortPolicy() 队列满了   不处理   抛出异常
         * CallerRunsPolicy()   队列满了  哪里来的去哪里（有时候main  有时候随机线程）
         * DiscardPolicy()   队列满了  丢掉任务 不抛出异常
         * DiscardOldestPolicy()   尝试和之前的竞争   代替他的位置进入队列里
         */
        try {
            //最大承载   Queue的容量+max
            for (int i = 0; i < 15; i++) {
                int temp = i;
                threadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName()+"===ok==="+temp);
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //线程池用完，程序结束，关闭线程池
            threadPool.shutdown();//卸载finally中保证程序跑完才关的
        }
    }
}
